import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-01-25
 * Time: 22:29
 */
class Solution {
//     思路:
//     前缀和 + 哈希优化
//     将所有 0 改为 -1
//     那么有相同数目的 0 和 1 的连续数组就是 和为 0 的连续数组
//     注意 map.put(0,-1) , 防止最长的连续数组就是从 0 下标开始
    public int findMaxLength(int[] nums) {
        int length=nums.length;
        // 将所有的 0 修改为 -1
        for(int i=0;i<length;i++){
            if(nums[i]==0){
                nums[i]=-1;
            }
        }
        Map<Integer, Integer> map=new HashMap<>();
        map.put(0,-1); //防止最长的连续数组就是从 0 下标开始
        int sum=0;
        int max=0;
        for(int i=0;i<length;i++){
            sum+=nums[i];
            // map 中始终存储 相同的值中最前面的位置的下标
            // 往 map 里面放的同时 查找, 减小时间复杂度
            // (当然也可以 同时再进行 0 修改为 -1 的操作)
            if(map.containsKey(sum)){
                max=Math.max(max, i-map.get(sum));
            }else{
                map.put(sum, i);
            }
        }
        return max;
    }
}
